#include <stdio.h>
#include <stdlib.h>

#define Error(x) printf(x); //输出报错信息

#define true 1;    //定义操作成功为1
#define false 0;   //定义操作失败为0
#define MaxSize 10 //定义栈中元素的个数
typedef char ElemType;
typedef struct Stack
{
    ElemType data[MaxSize]; //静态数组存放栈中的元素
    int top;                //栈顶指针(数组角标)
} * SqStack;

/* 初始化栈 */
void initStack(SqStack S)
{
    S = malloc(sizeof *S);
    //当top=-1时当前栈为空栈
    S->top = -1; //初始化栈顶指针
}

/* 判断栈是否为空 */
int stackEmpty(SqStack S)
{
    if (S->top == -1)
    {
        return true;
    }
    else
    {
        return false;
    }
}

/* 新元素x入栈 */
int push(SqStack S, ElemType x)
{
    //入栈时，先判断当前栈是否已满
    if (S->top == MaxSize - 1)
        return false;
    //先让栈顶指针+1
    S->top = S->top + 1;
    //让新元素入栈
    S->data[S->top] = x;
    // S->data[++S->top] = x;    这种写法也是OK的
    return true;
}

/* 出栈操作 */
int pop(SqStack S, ElemType x)
{
    //判断当前栈是否为空
    if (S->top == -1)
        return false;
    //让栈顶元素先出栈
    x = S->data[S->top];
    //再让栈顶指针-1
    S->top = S->top - 1;
    // x = S->data[S->top--];      这种写法也是OK的
    return true;
}

/* 读取栈顶元素 */
int getTop(SqStack S, ElemType x)
{
    //判断当前栈是否为空
    if (S->top == -1)
        return false;
    //让x把栈顶元素带出来
    x = S->data[S->top];
    return true;
}

int main()
{
    printf("Hello, World!\n");
    Error("呜呜呜");
    SqStack S;
    initStack(S);
    pop(S, 'a');
    pop(S, 'b');
    pop(S, 'c');
    pop(S, 'd');
    char x;
    getTop(S, x);
    printf("%c\n", x);
    return 0;
}
